package core

import (
	"fmt"
	"go.uber.org/zap"
	"os"
	"sort"
	"strconv"
	"time"
)

type ByModTime []os.FileInfo

func (fis ByModTime) Len() int {
	return len(fis)
}

func (fis ByModTime) Swap(i, j int) {
	fis[i], fis[j] = fis[j], fis[i]
}

func (fis ByModTime) Less(i, j int) bool {
	return fis[i].ModTime().Before(fis[j].ModTime())
}

// SortFile 根目录下的文件按时间大小排序，从远到近
func SortFile(path string) (files ByModTime) {
	f, err := os.Open(path)
	if err != nil {
		fmt.Println(err)
	}
	fis, err := f.Readdir(-1)
	if err != nil {
		fmt.Println(err)
	}
	defer f.Close()
	files = make(ByModTime, len(fis)+10)
	j := 0
	for _, v := range fis {
		files[j] = v
		j++
	}
	files = files[:j]
	sort.Sort(ByModTime(files))
	return
}

// DealWithFiles 返回当下时间的文件，并删除大于 5 个的文件，删除最早的
func DealWithFiles(path string, count int) int {
	removeCount := 0
	files := SortFile(path)
	if len(files) > count {
		for k, _ := range files[count:] {
			err := os.Remove(path + files[k].Name())
			if err != nil {
				zap.L().Error("文件删除失败", zap.Error(err))
				continue
			}
			removeCount++
		}
	}
	return removeCount
}

// PathExists 判断一个目录是否存在
func PathExists(path string) (bool, error) {
	_, err := os.Stat(path)
	if err == nil {
		return true, nil
	}
	if os.IsNotExist(err) {
		return false, nil
	}
	return false, err
}

// CreateDir CreateDataTableToSaveDirectory  创建备份数据表临时目录
func CreateDir(dir string) (string, error) {
	date := time.Now()
	itemDir := dir + "/" + strconv.Itoa(date.Year()) + date.Format("01") + strconv.Itoa(date.Day()) // 临时备份目录
	exists, err := PathExists(itemDir)
	if err != nil {
		zap.L().Error("临时目录判断是否存在错误", zap.Error(err))
		return "", err
	}

	if !exists {
		err := os.MkdirAll(itemDir, 0666)
		if err != nil {
			return "", err
		}
	}
	return itemDir, nil
}
